#面向对象(万物皆对象）的三大特征：封装，继承，多态
#小项目：封装-> 入口函数mian，自定义函数，全局变量
import threading
import urllib3
from bs4 import BeautifulSoup

target_url='https://p.weather.com.cn/zrds/index.shtml'

header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}


urls = []#存储已经下载过的图片链接的链接
threads = []#初始化一个列表用于存储所有的线程对象

#解析网页数据
def parseData(data):
    count = 0
    soup = BeautifulSoup(data,"lxml")
    images = soup.select("img")#返回img图片列表
    for img in images:
        src = img["src"]
        #下载图片
        if src not in urls:
            #1.使用新创建的线程执行下载操作
            #介绍线程：
            #举个例子：你在电脑上启动了迅雷下载工具，操作系统会在内存里创建一个空间用于
            #存储迅雷所有动作产生的数据，它实际上是一个进程（计算机里启动任何一个软件，
            #操作系统都会为它们创建一个进程（内存空间）；线程是进程的分支，一个进程
            #一定有一个主线程，进程也可以分出多个线程执行不同的任务，相当于迅雷同时
            #下载多个文件每一个下载任务都有一个线程来执行
            #2.下载的文件名使用序号标注
            count = count + 1
            T = threading.Thread(target=download,args=(src,count))
            T.setDaemon(False)
            T.start()
            threads.append(T)

#下载图片的操作
def download(url,count):
    try:
        if (url[len(url) - 4] == "."):
            ext = url[len(url) - 4:]
        else:
            ext = ".png"
        req = urllib3.PoolManager().request('GET', url, headers=header)
        data = req.data
        img_file = open("images\\" + str(count) + ext, "wb")
        img_file.write(data)
        img_file.close()
        print("图片已下载：" + str(count) + ext)
    except Exception as err:
        print(err)


#请求网页数据
def requestData():
    try:
        # 使用urllib3进行数据请求
        http = urllib3.PoolManager()
        rq = http.request('GET', target_url, headers=header)
        # 查看服务器的响应
        # print("获得网页返回的内容：", rq.data.decode('utf-8'))
        return rq.data.decode('utf-8')
    except Exception as err:
        print(err)


if __name__=='__main__':
    data = requestData()
    parseData(data)
